package org.zjx.operation;

import org.zjx.core.IWindow;
import org.zjx.entity.ParagraphBean;
import org.zjx.enums.FontType;

import java.awt.*;
import java.awt.image.BufferedImage;
import java.util.List;

/**
 * 操作执行器接口
 * 定义所有对窗口的具体操作
 */
public interface OperationExecutor {

    // ========== 窗口关联 ==========

    /**
     * 获取关联的窗口
     */
    IWindow getWindow();

    void setWindow(IWindow window);

    // ========== 截图操作 ==========

    /**
     * 截取整个窗口
     */
    BufferedImage screenshot();

    /**
     * 截取指定区域
     */
    BufferedImage screenshot(Rectangle region);

    // ========== 鼠标操作 ==========

    /**
     * 移动鼠标到指定位置
     */
    void move(int x, int y);

    default void move(double x, double y) {
        move((int) x, (int) y);
    }

    void gameMove(int x, int y);

    default void gameMove(double x, double y) {
        gameMove((int) x, (int) y);
    }

    void gameMove(Rectangle rectangle);

    /**
     * 在指定位置点击次数
     */
    void click(int x, int y);

    default void click(double x, double y) {
        click((int) x, (int)y);
    }


    void click(int button);

    /**
     * 按下鼠标按钮
     */
    void pressMouse(int button);

    /**
     * 释放鼠标按钮
     */
    void releaseMouse(int button);

    /**
     * 获取鼠标当前位置
     */
    Point getMousePosition();

    /**
     * 拖拽操作
     */
    void drag(int fromX, int fromY, int toX, int toY);

    default void drag(double fromX, double fromY, double toX, double toY) {
        drag((int) fromX, (int) fromY, (int) toX, (int) toY);
    }

    // ========== 键盘操作 ==========

    /**
     * 按下并释放按键
     */
    void press(int keyCode);

    /**
     * 按下按键
     */
    void pressKey(int keyCode);

    /**
     * 释放按键
     */
    void releaseKey(int keyCode);

    /**
     * 输入文本
     */
    void type(String text);

    /**
     * 组合键
     */
    void hotkey(int... keyCodes);

    // ========== 图像识别 ==========

    /**
     * 查找图片位置
     */
    Point findImage(BufferedImage template);

    /**
     * 查找所有匹配的图片位置
     */
    List<Point> findAllImages(BufferedImage template);

    /**
     * 检查区域是否存在指定颜色
     */
    boolean findColor(Rectangle region, Color targetColor);

    /**
     * 检查区域是否存在指定颜色列表中的任一颜色
     */
    boolean findColor(Rectangle region, List<Color> targetColors);

    /**
     * 获取指定位置的颜色
     */
    Color getColor(int x, int y);

    // ========== 识字方法 ==========

    String identifyTess(BufferedImage bufferedImage);

    List<ParagraphBean.Word> identifyFont(IWindow window, BufferedImage screen, Rectangle rectangle, List<Color> colors, FontType fontType, int fontHeight, boolean reverse);

    // ========== 工具方法 ==========

    /**
     * 延迟等待
     */
    void delay(long milliseconds);

    /**
     * 获取底层的 Robot实例
     */
    Robot getRobot();
}